package com.joyd.joydlib.dev

import android.content.Context
import android.content.Intent
import android.provider.Settings
import android.util.Log
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit

/**
 * 无障碍服务工具类
 * 提供检查、启用和等待无障碍服务的功能
 */
object AccessibilityServiceUtils {
    private const val TAG = "AccessibilityServiceUtils"

    /**
     * 检查无障碍服务是否已启用
     * @param context 上下文
     * @param serviceClass 无障碍服务类
     * @return true表示已启用，false表示未启用
     */
    fun isAccessibilityServiceEnabled(context: Context, serviceClass: Class<*>): Boolean {
        return try {
            val serviceName = serviceClass.name
            Log.e("ScreenTapExample","服务的完整类名:"+serviceName)
            val enabledServices = Settings.Secure.getString(
                context.contentResolver,
                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
            )
            Log.e("ScreenTapExample","服务列表:"+enabledServices)
            if (enabledServices.isNullOrEmpty()) {
                return false
            }
            
            val services = enabledServices.split(":")
            
            // 检查两种可能的格式：完整类名或包名/类名格式
            return services.any { service ->
                service.contains(serviceName) || service == serviceName
            }
        } catch (e: Exception) {
            Log.e(TAG, "检查无障碍服务状态失败", e)
            false
        }
    }

    /**
     * 跳转到系统无障碍设置界面
     * @param context 上下文
     */
    fun goToAccessibilitySetting(context: Context) {
        val intent = Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        context.startActivity(intent)
    }

    /**
     * 等待无障碍服务启用
     * @param context 上下文
     * @param serviceClass 无障碍服务类
     * @param timeout 超时时间（毫秒）
     * @return true表示在超时前服务已启用，false表示超时
     */
    fun waitForAccessibilityServiceEnabled(
        context: Context,
        serviceClass: Class<*>,
        timeout: Long
    ): Boolean {
        val latch = CountDownLatch(1)
        val checkInterval = 500L // 检查间隔时间（毫秒）
        val endTime = System.currentTimeMillis() + timeout

        val checkRunnable = object : Runnable {
            override fun run() {
                if (isAccessibilityServiceEnabled(context, serviceClass)) {
                    latch.countDown()
                    return
                }

                if (System.currentTimeMillis() < endTime) {
                    // 继续检查
                    android.os.Handler(android.os.Looper.getMainLooper()).postDelayed(
                        this,
                        checkInterval
                    )
                } else {
                    // 超时
                    Log.w(TAG, "等待无障碍服务启用超时")
                    latch.countDown()
                }
            }
        }

        // 开始检查
        android.os.Handler(android.os.Looper.getMainLooper()).post(checkRunnable)

        try {
            // 等待服务启用或超时
            return latch.await(timeout, TimeUnit.MILLISECONDS)
        } catch (e: InterruptedException) {
            Thread.currentThread().interrupt()
            Log.e(TAG, "等待过程被中断", e)
            return false
        }
    }

    /**
     * 确保无障碍服务已启用
     * 如果未启用，则跳转到设置界面并等待用户启用
     * @param context 上下文
     * @param serviceClass 无障碍服务类
     * @param timeout 等待超时时间（毫秒）
     * @return true表示服务已启用，false表示用户未在超时时间内启用服务
     */
    fun ensureAccessibilityServiceEnabled(
        context: Context,
        serviceClass: Class<*>,
        timeout: Long = 60000 // 默认超时时间为60秒
    ): Boolean {
        if (isAccessibilityServiceEnabled(context, serviceClass)) {
            return true
        }

        // 跳转到无障碍设置界面
        goToAccessibilitySetting(context)

        // 等待用户启用服务
        return waitForAccessibilityServiceEnabled(context, serviceClass, timeout)
    }
}